<?php

namespace think\qiniu;


/**
 * 计算文件的crc32检验码:
 *
 * @param $file string  待计算校验码的文件路径
 *
 * @return 文件内容的crc32校验码
 */
function crc32_file($file)
{
    $hash = hash_file('crc32b', $file);
    $array = unpack('N', pack('H*', $hash));
    return sprintf('%u', $array[1]);
}

/**
 * 计算输入流的crc32检验码
 *
 * @param $data 待计算校验码的字符串
 *
 * @return 输入字符串的crc32校验码
 */
function crc32_data($data)
{
    $hash = hash('crc32b', $data);
    $array = unpack('N', pack('H*', $hash));
    return sprintf('%u', $array[1]);
}

/**
 * 对提供的数据进行urlsafe的base64编码。
 *
 * @param string $data 待编码的数据，一般为字符串
 *
 * @return string 编码后的字符串
 * @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64
 */
function base64_urlSafeEncode($data)
{
    $find = array('+', '/');
    $replace = array('-', '_');
    return str_replace($find, $replace, base64_encode($data));
}

/**
 * 对提供的urlsafe的base64编码的数据进行解码
 *
 * @param string $data 待解码的数据，一般为字符串
 *
 * @return string 解码后的字符串
 */
function base64_urlSafeDecode($str)
{
    $find = array('-', '_');
    $replace = array('+', '/');
    return base64_decode(str_replace($find, $replace, $str));
}

/**
 * Wrapper for JSON decode that implements error detection with helpful
 * error messages.
 *
 * @param string $json    JSON data to parse
 * @param bool $assoc     When true, returned objects will be converted
 *                        into associative arrays.
 * @param int    $depth   User specified recursion depth.
 *
 * @return mixed
 * @throws \InvalidArgumentException if the JSON cannot be parsed.
 * @link http://www.php.net/manual/en/function.json-decode.php
 */
function json_decode($json, $assoc = false, $depth = 512)
{
    static $jsonErrors = array(
        JSON_ERROR_DEPTH => 'JSON_ERROR_DEPTH - Maximum stack depth exceeded',
        JSON_ERROR_STATE_MISMATCH => 'JSON_ERROR_STATE_MISMATCH - Underflow or the modes mismatch',
        JSON_ERROR_CTRL_CHAR => 'JSON_ERROR_CTRL_CHAR - Unexpected control character found',
        JSON_ERROR_SYNTAX => 'JSON_ERROR_SYNTAX - Syntax error, malformed JSON',
        JSON_ERROR_UTF8 => 'JSON_ERROR_UTF8 - Malformed UTF-8 characters, possibly incorrectly encoded'
    );

    $data = \json_decode($json, $assoc, $depth);

    if (JSON_ERROR_NONE !== json_last_error()) {
        $last = json_last_error();
        throw new \InvalidArgumentException(
            'Unable to parse JSON data: '
            . (isset($jsonErrors[$last])
                ? $jsonErrors[$last]
                : 'Unknown error')
        );
    }

    return $data;
}

/**
 * 计算七牛API中的数据格式
 *
 * @param $bucket 待操作的空间名
 * @param $key 待操作的文件名
 *
 * @return 符合七牛API规格的数据格式
 * @link http://developer.qiniu.com/docs/v6/api/reference/data-formats.html
 */
function entry($bucket, $key)
{
    $en = $bucket;
    if (!empty($key)) {
        $en = $bucket . ':' . $key;
    }
    return base64_urlSafeEncode($en);
}
